<?php

require_once('./env.php');
/*
 * 公共方法部分
 */

// 判断请求是否符合规定
function isUrlOk()
{
    global $_method, $_urlKeys, $_token, $_action, $_giteePassWord, $_userName;
    // 判断请求方式是否OK
    $method = $_SERVER['REQUEST_METHOD'];
    if (!in_array($method, $_method)) {
        die('REQUEST_METHOD Failed');
    }
    // 判断参数内容是否OK
    $getParmas = $_GET;
    foreach ($getParmas as $i => $Key) {
        if (!in_array($i, $_urlKeys)) {
            die("Params {$i} Do Not Mach");
        }
    }
    // 判断关键参数值是否正确
    if (!in_array($_GET['action'], $_action)) {
        die('Action Do Not Mach');
    }
    // 判断用户名是否正确
    if ($_GET['username'] !== $_userName) {
        die('UserName Do Not Mach');
    }
    // 判断token是否正确
    if ($_GET['token'] !== $_token) {
        die('Token Do Not Mach');
    }
}

// 根据不同的action，执行不同的方法
function doAction()
{
    switch ($_GET['action']) {
        case 'init':
        gitInit();
            break;

        case 'clone':
        gitClone();
            break;

        case 'pull':
        gitPull();
            break;
        
        case 'del':
        gitDelete();
            break;

        default:
            # code...
            break;
    }
}

// init方法，主要测试php环境是否可用，并提示执行clone方法
function gitInit()
{
    global $savePath;
    $res = "";
    // 判断原来是否有文件夹
    if (is_dir($savePath)) {
        deldir($savePath);
        $res .= date('Y-m-d H:i:s')." delete folder {$savePath}".PHP_EOL;
    }
    // 创建日志文件，并写入日志
    $res .= date('Y-m-d H:i:s')." git init --------".PHP_EOL;
    markToLog($res);
}

// Clone方法
function gitClone()
{
    global $savePath, $gitPath;
    // 判断原来是否有文件夹,r如果有，就初始化
    if (is_dir($savePath)) {
        gitInit();
    }
    $res = date('Y-m-d H:i:s')." git clone start --------".PHP_EOL;
    //注:在这里需要设置用户邮箱和用户名,不然后面无法拉去代码
    $res .shell_exec("git clone {$gitPath} {$savePath}").PHP_EOL;
    $res .= date('Y-m-d H:i:s')." git clone end --------".PHP_EOL;
    markToLog($res);
}
// Pull方法
function gitPull()
{
    global $savePath, $gitPath, $_giteePassWord;
    if (!is_dir($savePath."/.git")) {
        gitClone();
    }
    //  payload为字符串，需要经过解析
    $payload = file_get_contents('php://input');

    if (!$payload) {
        header('HTTP/1.1 400 Bad Request');
        die('HTTP HEADER or POST is missing.');
    }
    $content = json_decode($payload, true);

    // 如果启用验证，并且验证失败，返回错误
    if ($_giteePassWord && $content['password'] != $_giteePassWord) {
        header('HTTP/1.1 403 Permission Denied');
        die('Permission denied.');
    }

    $res = date('Y-m-d H:i:s')." git pull start --------".PHP_EOL;
    $res .= shell_exec("cd {$savePath} && git pull {$gitPath} 2>&1");//拉去代码
    $res .= date('Y-m-d H:i:s')." git pull end --------".PHP_EOL;
    markToLog($res);
    die("done " . date('Y-m-d H:i:s', time()));
}

// 删除项目
function gitDelete()
{
    global $savePath, $gitPath;
    deldir($savePath);
    $res .= date('Y-m-d H:i:s')." delete folder {$savePath}".PHP_EOL;
    // 创建日志文件，并写入日志
    $res .= date('Y-m-d H:i:s')." git delete --------".PHP_EOL;
    markToLog($res);
    die("done " . date('Y-m-d H:i:s', time()));
}

// 删除文件及文件夹
function deldir($path){
    shell_exec("rm -rf {$path}");
}

// 记录日志到文件
function markToLog($logs)
{
    global $log_file;
    file_put_contents($log_file, $logs, FILE_APPEND);//写入日志到log文件中
}
